home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
United Public Domain Gold 4
/
United Public Domain Gold 4.iso
/
fredfish
/
ff.0316.dms
/
ff.0316.adf
/
Formulae
/
Formulae.scm
< prev
next >
Wrap
Text File
|
1990-02-06
|
11KB
|
263 lines
;
; Formulae - Some simple and not so simple Scheme functions to handle
; sets and propositional formulaes.
; This code uses only essential procedures so it should run nice and
; easy under any Scheme.
;
; By Gauthier Groult, May 1989, with serious help from Bertrand Lecun
; - thanks Bertrand!
;
; Gauthier Groult
; 33, Blvd Saint Denis, 92400, Courbevoie, France
; Tel: (1) 47 89 09 54
; EMail: groult@germinal.ibp.fr
;
; Read the joined doc file for more info.
;
; 1. Ensembles finis.
; ~~~~~~~~~~~~~~~~~~~
; Six fonctions permettant les manipulations de base sur les ensembles.
; [ la fonction (inter) est ajoutee a titre illustratif, elle n'est pas
; utilisee par la suite ]
;
(define (empty) nil)
(define (singleton x) (list x))
(define (add elem set)
(if (member elem set) set
(append (singleton elem) set)))
(define (union set1 set2)
(cond ((null? set1) set2)
((member (car set1) set2) (union (cdr set1) set2))
(#t (cons (car set1) (union (cdr set1) set2)))))
(define (inter set1 set2)
(cond ((null? set1) ())
((member (car set1) set2) (cons (car set1) (inter (cdr set1) set2)))
(#t (inter (cdr set1) set2))))
; (pairs e set) retourne le produit cartesien (e) x set
;
(define (pairs elem set)
(if (null? set) ()
(union (list (list elem (car set))) (pairs elem (cdr set)))))
(define (product set1 set2)
(if (null? set1) ()
(append (pairs (car set1) set2) (product (cdr set1) set2))))
; 2. Manipulation de formules.
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; NB: toutes les fonctions definies dans cette partie sont independates de
; l'ensemble des connecteurs utilises. On peut changer ce dernier, les
; resultats des fonctions resteront coherents et refleteront les nouveaux
; connecteurs.
;
; Definissons les connecteurs de notre espace par une liste structuree donnant
; leur non et le nombre de leurs arguments (soit la longueur du connecteur+1).
; [on aurait en C: struct Connector { char *name; int len; };
; struct Connector Connector[MAX_CONNECTORS] = { {..}, ... };]
;
(define connectors '(et 3 ou 3 imp 3 equiv 3 non 2))
; (axioms) est la liste des quatorze axiomes du calcul propositionnel
;
(define axioms
(list '(imp f (imp g f))
'(imp (imp f (imp g h)) (imp (imp f g) (imp f h)))
'(imp (et f g) f)
'(imp (et f g) g)
'(imp (imp f g) (imp (imp f h) (imp f (et g h))))
'(imp f (ou f g))
'(imp g (ou f g))
'(imp (imp f h) (imp (imp g h) (imp (ou f g) h)))
'(imp (imp f g) (imp (non g) (non f)))
'(imp f (non (non f)))
'(imp (non (non f)) f)
'(imp (equiv f g) (imp f g))
'(imp (equiv f g) (imp g f))
'(imp (imp f g) (imp (imp g f) (equiv f g)))))
; Quelques fontions utilitaires:
; (connector? x) retourne le nombre d'arguments du symbole x si x est un
; connecteur valide, et #f s'il n'en est pas un.
; (c1? x) retourne #t si le symbole x est un connecteur unaire, #f sinon.
; (c2? x) retourne #t si le symbole x est un connecteur binaire, #f sinon.
; (alltrue? l) retourne #t si tous les elements de la liste l sont #t.
; (variable? x) retourne #t si x est un symbole non nul et n'est pas un
; connecteur.
;
(define (connector? x)
(if (member x connectors) (cadr (member x connectors)) #f))
(define (c1? c) (if (equal? 2 (connector? c)) #t #f))
(define (c2? c) (if (equal? 3 (connector? c)) #t #f))
(define (alltrue? l)
(cond ((null? l) #t) ((equal? (car l) #f) #f) (#t (alltrue? (cdr l)))))
(define (variable? x)
(not (or (null? x) (not (symbol? x)) (connector? x))))
; ... et les fonctions demandees par l'enonce:
;
(define (formula? f)
(or (variable? f)
(and (equal? (connector? (car f)) (length f))
(alltrue? (map formula? (cdr f))))))
(define (vars f)
(cond ((variable? f) (singleton f))
((c1? (car f)) (vars (cadr f)))
((c2? (car f)) (union (vars (cadr f)) (vars (caddr f))))))
(define (subst f v g)
(if (variable? f) (if (equal? f v) g f)
(cons (car f)
(cons (subst (cadr f) v g)
(if (c1? (car f)) () (list (subst (caddr f) v g)))))))
; 3. Tables de verite.
; ~~~~~~~~~~~~~~~~~~~~
; NB: dans cette partie les fonctions *SONT* dependantes des connecteurs
; specifies dans la liste (connectors). Leurs resultats seront faux si cette
; liste est alteree.
;
(define (table varset)
(if (null? varset) (singleton nil)
(letrec ((foo (lambda (x y)
(if (null? (cdr y))
(cons (append x (list (cons (car y) '(#f))))
(list (append x (list (cons (car y) '(#t))))))
(append (foo (append x (list (cons (car y) '(#f)))) (cdr y))
(foo (append x (list (cons (car y) '(#t)))) (cdr y)))))))
(foo () varset))))
; Il faut quelques outils supplementaires pour true?, valid? et refute:
; (xeval v a) retourne la valeur du symbole a evalue sous l'assignation
; a, qui est supposee correcte.
; (feval f a) retourne le 'et' de l'evaluation de la formule f par toutes
; les assignations de la liste d'assignations a. f et a sont
; supposees correctes.
; (refutes? f a) retourne #t si l'assignation a refute la formule f, a et f
; etant supposees correctes.
; (refutelist f a) retourne la liste des assignations prises parmi la liste
; d'assignations a qui refutent f. a et f sont supposees
; etre correctement ecrites.
;
(define (xeval v a) (if (member (cons v '(#t)) a) #t #f))
(define (feval f a)
(if (not (null? a)) (and (true? f (car a)) (feval f (cdr a))) #t))
(define (refutes? f a) (if (not (true? f a)) a))
(define (refutelist f a)
(if (not (null? a)) (let ((set (refutes? f (car a))))
(if (null? set) (refutelist f (cdr a))
(append (list set) (refutelist f (cdr a)))))))
; ... et les fonctions elles-memes:
;
(define (true? f a)
(if (variable? f) (xeval f a)
(cond
((eq? (car f) 'non) (not (true? (cadr f) a)))
((eq? (car f) 'et) (and (true? (cadr f) a) (true? (caddr f) a)))
((eq? (car f) 'ou) (or (true? (cadr f) a) (true? (caddr f) a)))
((eq? (car f) 'imp) (or (not (true? (cadr f) a)) (true? (caddr f) a)))
((eq? (car f) 'equiv) (eq? (true? (cadr f) a) (true? (caddr f) a))))))
(define (valid? f)
(if (formula? f) (feval f (table (vars f))) '(not a formula)))
(define (refute f)
(if (formula? f) (refutelist f (table (vars f))) '(not a formula)))
; 4. Connecteurs de Sheffer.
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
; NB: dans cette partie les fonctions *SONT* dependantes des connecteurs
; specifies dans la liste (connectors). Leurs resultats seront faux si cette
; liste est alteree.
;
; Trois fonctions de support pour tester si une formule est "de Sheffer":
; (negate a) calcule la negation de l'assignation a suppossee correcte.
; (shefferc1? f) retourne #t si la formule f supposee correcte verifie la
; premiere propriete de Sheffer.
; (shefferc2? f) retourne #t si la formule f supposee correcte verifie la
; seconde propriete de Sheffer.
; (shefferc3? f) retourne la liste de toutes les assignations pour lesquelles
; f verifie la troisieme propriete de Sheffer, s'il y en a,
; et #f sinon. f est supposee correcte.
;
;
(define (negate a)
(append (list (list (caar a) (not (cadar a))))
(if (null? (cdr a)) () (negate (cdr a)))))
(define (shefferc1? f) (not (true? f (product (vars f) '(#t)))))
(define (shefferc2? f) (true? f (product (vars f) '(#f))))
(define (shefferc3? f)
(letrec ((c3? (lambda (a)
(cond ((null? a) #f)
((eq? (true? f (car a)) (true? f (negate (car a)))) (car a))
(#t (c3? (cdr a))))))) (c3? (table (vars f)))))
(define (sheffer? f)
(if (not (formula? f)) '(not a formula)
(and (shefferc1? f) (shefferc2? f) (not (null? (shefferc3? f))))))
; ... et trois fonctions de support pour la "shefferisation":
; (s0 stroke name v) exprime le connecteur non par le connecteur de Sheffer
; (s1 stroke name v w) retourne une liste semblable a s0, ou v et w sont
; ordonnees selon la liste retournee par shefferc3?.
; (s2 stroke name c v w) exprime les connecteurs et & ou par le connecteur de
; Sheffer. Si c=#t, et est exprime, sinon ou l'est.
;
(define (s0 stroke name v)
(letrec ((dummy (lambda (x)
(if (not (null? x)) (append (list v) (dummy (cdr x)))))))
(cons name (dummy (vars stroke)))))
(define (s1 stroke name v w)
(letrec ((dummy (lambda (x)
(if (not (null? x))
(append (list (if (cadar x) v w)) (dummy (cdr x)))))))
(cons name (dummy (shefferc3? stroke)))))
(define (s3 stroke name c v w)
(letrec ((x (shefferc3? stroke)) (sh (true? stroke x)))
(if (equal? c sh)
(s0 stroke name (s1 stroke name v w))
(s1 stroke name (s0 stroke name v) (s0 stroke name w)))))
(define (shefferize stroke name f)
(letrec ((dummy (lambda (x)
(if (variable? x) x
(cond
((equal? (car x) 'non) (s0 stroke name (cadr x)))
((equal? (car x) 'et) (s3 stroke name #t (dummy (cadr x)) (dummy (caddr x))))
((equal? (car x) 'ou) (s3 stroke name #f (dummy (cadr x)) (dummy (caddr x))))
((equal? (car x) 'imp) (s3 stroke name #f
(s0 stroke name (dummy (cadr x))) (dummy(caddr x))))
((equal? (car x) 'equiv) (s3 stroke name #f
(s3 stroke name #t (dummy (cadr x)) (dummy (caddr x)))
(s0 stroke name (s3 stroke name #f
(dummy (cadr x)) (dummy(caddr x)))))))))))
(dummy f)))